/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.sadhar.sipp.perekamankomponenanggaranbiayagaji;

import org.sadhar.sia.framework.ClassApplicationModule;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Label;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Radiogroup;
import org.zkoss.zul.Space;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Window;

/**
 *
 * @author hendro
 * revisied by : sarah (BAPSI), tgl 17-12-2009
 */
public class PerekamanKomponenAnggaranBiayaGajiWnd extends ClassApplicationModule {

    public static Combobox cmbboxTahunKomponen;
    private Radio rdKomponenGajiYa;
    private Radio rdKomponenGajiTidak;
    private Combobox cmbboxKomponenPegawai;
    private Textbox txtboxNamaKomponen;
    private Textbox txtboxKdKomponenGaji;
    private Textbox txtboxAlias;
    private Textbox txtboxRumus;
    private Listbox lstboxKomponenAnggaranGaji;
    private Button btnTambahKomponen;
//    private Toolbarbutton toolbarTambahKomponen;
//    private Toolbarbutton toolbarTambahSimbol;
    private Textbox idKomponenPegawai;
    private Button btnBatal;
    private Button btnCariNamaKomponen;
    private Textbox txtboxIdKomponen;
    private Radiogroup rdGroupKomponenGaji;
    private PerekamanKomponenAnggaranBiayaGajiDAO dao;
    private String oldKomponen = "";
    private int kurungBuka = 0;
    private int kurungTutup = 0;
    private Label lblPesanError;
    boolean isDot = false;

    public PerekamanKomponenAnggaranBiayaGajiWnd() {
        dao = new PerekamanKomponenAnggaranBiayaGajiDAOImpl();
    }

    public void onCreate() throws Exception {
        txtboxIdKomponen = (Textbox) getFellow("txtboxIdKomponen");
        lblPesanError = (Label) getFellow("lblPesanError");
        cmbboxTahunKomponen = (Combobox) getFellow("cmbboxTahunKomponen");
        rdKomponenGajiYa = (Radio) getFellow("rdKomponenGajiYa");
        rdKomponenGajiTidak = (Radio) getFellow("rdKomponenGajiTidak");
        cmbboxKomponenPegawai = (Combobox) getFellow("cmbboxKomponenPegawai");
        txtboxNamaKomponen = (Textbox) getFellow("txtboxNamaKomponen");
        txtboxAlias = (Textbox) getFellow("txtboxAlias");
        txtboxRumus = (Textbox) getFellow("txtboxRumus");
        txtboxKdKomponenGaji = (Textbox) getFellow("txtboxKdKomponenGaji");
//        toolbarTambahKomponen = (Toolbarbutton) getFellow("toolbarTambahKomponen");
//        toolbarTambahSimbol = (Toolbarbutton) getFellow("toolbarTambahSimbol");
        idKomponenPegawai = (Textbox) getFellow("idKomponenPegawai");
        lstboxKomponenAnggaranGaji = (Listbox) getFellow("lstboxKomponenAnggaranGaji");
        btnBatal = (Button) getFellow("btnBatal");
        btnCariNamaKomponen = (Button) getFellow("btnCariNamaKomponen");
        rdGroupKomponenGaji = (Radiogroup) getFellow("rdGroupKomponenGaji");
        btnTambahKomponen = (Button) getFellow("btnTambahKomponen");
        loadTahunAnggaran();
        loadNamaKomponen();
        rdKomponenGajiTidak.setChecked(true);
        btnCariNamaKomponen.setVisible(false);
    }

    public void rdGroupKomponenGajiOnCheck() throws Exception {
        if (rdKomponenGajiTidak.isChecked()) {
            btnCariNamaKomponen.setVisible(false);
        } else {
            btnCariNamaKomponen.setVisible(true);
        }
    }

    private void clearComponen() throws Exception {
        txtboxIdKomponen.setValue("");
//        cmbboxTahunKomponen.setValue("");
        rdKomponenGajiTidak.setSelected(true);
        rdKomponenGajiYa.setSelected(false);
        cmbboxKomponenPegawai.setValue("");
        idKomponenPegawai.setValue("");
        txtboxNamaKomponen.setValue("");
        txtboxKdKomponenGaji.setValue("");
        txtboxAlias.setValue("");
        txtboxRumus.setValue("");
        btnCariNamaKomponen.setVisible(false);
    }

    private void loadTahunAnggaran() throws Exception {
        cmbboxTahunKomponen.getItems().clear();
        for (String str : dao.loadTahun()) {
            cmbboxTahunKomponen.appendChild(new Comboitem(str));
        }
    }

    public void TahunKomponenOnChange() throws Exception {
        loadKomponenAnggaranGaji();
    }

    private void loadNamaKomponen() throws Exception {
        cmbboxKomponenPegawai.getItems().clear();
        for (KomponenPegawai k : dao.loadKomponePegawai()) {
            Comboitem item = new Comboitem();
            item.setValue(k);
            item.setLabel(k.getNm_stat_edu());
            cmbboxKomponenPegawai.appendChild(item);
        }
    }

    private void loadKomponenAnggaranGaji() throws Exception {
        String tahun = this.cmbboxTahunKomponen.getValue();
        lstboxKomponenAnggaranGaji.getItems().clear();
        int no = 1;
        for (final PerekamanKomponenAnggaranBiayaGaji obj : dao.list(tahun)) {
            Listitem item = new Listitem();
            item.setValue(obj);
            //
            if (oldKomponen.equalsIgnoreCase(dao.selectKomponenPegawai(obj.getAdm()).getNm_stat_edu())) {
                item.appendChild(new Listcell(""));
            } else {
                item.appendChild(new Listcell(dao.selectKomponenPegawai(obj.getAdm()).getNm_stat_edu()));
                oldKomponen = dao.selectKomponenPegawai(obj.getAdm()).getNm_stat_edu();
            }
            //
            if (obj.getIsKomponenGaji().equalsIgnoreCase("Y")) {
                item.appendChild(new Listcell(dao.selectKomponeGaji(obj.getKodeKomponenGaji()).getNmKomponen()));
            } else {
                item.appendChild(new Listcell(obj.getKomponenDiluarGaji()));
            }
            //
            item.appendChild(new Listcell(obj.getAlias()));
            item.appendChild(new Listcell(obj.getRumus()));

            Listcell cellAksi = new Listcell();
            Toolbarbutton btnUbah = new Toolbarbutton();
            btnUbah.setLabel("[ubah]");
            btnUbah.setId("btnUbah" + (no++));
            btnUbah.addEventListener("onClick", new EventListener() {

                public void onEvent(Event arg0) throws Exception {
                    txtboxIdKomponen.setValue(obj.getIdKomponen() + "");
                    cmbboxTahunKomponen.setValue(obj.getTahunAnggaran());
                    if (obj.getIsKomponenGaji().equalsIgnoreCase("Y")) {
                        rdKomponenGajiYa.setSelected(true);
                        rdKomponenGajiTidak.setSelected(false);
                        txtboxNamaKomponen.setValue(dao.selectKomponeGaji(obj.getKodeKomponenGaji()).getNmKomponen());
                        txtboxKdKomponenGaji.setValue(obj.getKodeKomponenGaji());
                        btnCariNamaKomponen.setVisible(true);
                    } else {
                        rdKomponenGajiYa.setSelected(false);
                        rdKomponenGajiTidak.setSelected(true);
                        txtboxNamaKomponen.setValue(obj.getKomponenDiluarGaji());
                        txtboxKdKomponenGaji.setValue("");
                        btnCariNamaKomponen.setVisible(false);
                    }
                    cmbboxKomponenPegawai.setValue(dao.selectKomponenPegawai(obj.getAdm()).getNm_stat_edu());
                    idKomponenPegawai.setValue(obj.getAdm());
                    txtboxAlias.setValue(obj.getAlias());
                    txtboxRumus.setValue(obj.getRumus());
                    setDisableComponen(false);
                }
            });
            final Toolbarbutton btnHapus = new Toolbarbutton();
            btnHapus.setLabel("[hapus]");
            btnHapus.setId("btnHapus" + (no++));
            btnHapus.addEventListener("onClick", new EventListener() {

                public void onEvent(Event arg0) throws Exception {
                    if (Messagebox.show("Apakah data akan dihapus?", "Konfirmasi", Messagebox.YES | Messagebox.NO, Messagebox.QUESTION) == Messagebox.YES) {
                        try {
                            dao.delete(obj);
                        } catch (Exception ex) {
                            Messagebox.show("Gagal menghapus data: " + ex.getMessage());
                        }
                        btnHapus.addForward(null, btnBatal, "onClick");
                    }
                }
            });
            cellAksi.appendChild(btnUbah);
            cellAksi.appendChild(new Space());
            cellAksi.appendChild(btnHapus);
            item.appendChild(cellAksi);
            lstboxKomponenAnggaranGaji.appendChild(item);
        }
    }

    public void btnSimpanOnClick() throws Exception {
        if (cmbboxTahunKomponen.getValue().isEmpty()) {
            Messagebox.show("Silahkan pilih Tahun Komponen", "Pesan Informasi", Messagebox.OK, Messagebox.INFORMATION);
            return;
        }
        if (cmbboxKomponenPegawai.getValue().isEmpty()) {
            Messagebox.show("Silahkan pilih Komponen Pegawai", "Pesan Informasi", Messagebox.OK, Messagebox.INFORMATION);
            return;
        }
        if (txtboxNamaKomponen.getValue().isEmpty()) {
            Messagebox.show("Silahkan pilih atau input nama Komponen", "Pesan Informasi", Messagebox.OK, Messagebox.INFORMATION);
            return;
        }
        if (txtboxAlias.getValue().isEmpty()) {
            Messagebox.show("Silahkan input Alias", "Pesan Informasi", Messagebox.OK, Messagebox.INFORMATION);
            return;
        }
        if (txtboxAlias.getValue().length() > 1) {
            Messagebox.show("Input Alias Tidak Boleh Dari 1 Karakter", "Pesan Informasi", Messagebox.OK, Messagebox.INFORMATION);
            return;
        }
//        if (txtboxRumus.getValue().isEmpty()) {
//            Messagebox.show("Silahkan input Rumus", "Pesan Informasi", Messagebox.OK, Messagebox.INFORMATION);
//            return;
//        }
        PerekamanKomponenAnggaranBiayaGaji obj = new PerekamanKomponenAnggaranBiayaGaji();
        obj.setTahunAnggaran(cmbboxTahunKomponen.getValue());
        if (rdKomponenGajiYa.isChecked()) {
            obj.setIsKomponenGaji("Y");
            obj.setKodeKomponenGaji(txtboxKdKomponenGaji.getValue());
        } else {
            obj.setIsKomponenGaji("N");
            obj.setKomponenDiluarGaji(txtboxNamaKomponen.getValue());
        }
        obj.setAdm(idKomponenPegawai.getValue());
        obj.setAlias(txtboxAlias.getValue());
        obj.setRumus(txtboxRumus.getValue());
        if (txtboxIdKomponen.getValue().isEmpty()) {
            if (dao.select(obj.getTahunAnggaran(), obj.getKodeKomponenGaji(), obj.getKomponenDiluarGaji(), obj.getAlias(), obj.getAdm()).size() <= 0) {
                dao.insert(obj);
            } else {
                Messagebox.show("Data gagal disimpan, duplikasi data tidak diizinkan", "Pesan Informasi", Messagebox.OK, Messagebox.INFORMATION);
                return;
            }
        } else {
            obj.setIdKomponen(Integer.valueOf(txtboxIdKomponen.getValue()));
            if (dao.selectUpdate(obj.getTahunAnggaran(), obj.getIdKomponen(), obj.getKodeKomponenGaji(), obj.getKomponenDiluarGaji(), obj.getAlias(), obj.getAdm()).size() <= 0) {
                dao.update(obj);
            } else {
                Messagebox.show("Data gagal disimpan, duplikasi data tidak diizinkan", "Pesan Informasi", Messagebox.OK, Messagebox.INFORMATION);
                return;
            }
        }
        clearComponen();
        loadKomponenAnggaranGaji();
        loadTahunAnggaran();
        Messagebox.show("Data tersimpan", "Pesan Informasi", Messagebox.OK, Messagebox.INFORMATION);

    }

    public void cmbboxKomponenPegawaiOnSelect() throws Exception {
        KomponenPegawai kp = (KomponenPegawai) cmbboxKomponenPegawai.getSelectedItem().getValue();
        idKomponenPegawai.setValue(kp.getKd_stat_edu() + "");
    }

    public void btnBatalOnClick() throws Exception {
        clearComponen();
        setDisableComponen(false);
        loadKomponenAnggaranGaji();
    }

    public void btnCariNamaKomponenOnClick() throws Exception {
        final Window win = (Window) Executions.createComponents("/sippzul/perekamankomponenanggaranbiayagaji/KomponenGajiPopup.zul", this, null);
        win.doModal();
    }

    public void toolbarTambahKomponenOnClick() throws Exception {
        if (cmbboxTahunKomponen.getSelectedIndex() >= 0) {
            final Window win = (Window) Executions.createComponents("/sippzul/perekamankomponenanggaranbiayagaji/DaftarKomponenPopup.zul", this, null);
            win.doModal();
            txtboxRumusOnChanging();
        } else {
            Messagebox.show("Pilih tahun komponen terlebih dahulu");
        }
    }

    public void toolbarTambahSimbolOnClick() throws Exception {
        final Window win = (Window) Executions.createComponents("/sippzul/perekamankomponenanggaranbiayagaji/SimbolOperasiPopup.zul", this, null);
        win.doModal();
    }

    public void lstboxKomponenAnggaranGajiOnSelect() throws Exception {
        PerekamanKomponenAnggaranBiayaGaji obj = (PerekamanKomponenAnggaranBiayaGaji) lstboxKomponenAnggaranGaji.getSelectedItem().getValue();
        cmbboxTahunKomponen.setValue(obj.getTahunAnggaran());
        if (obj.getIsKomponenGaji().equalsIgnoreCase("Y")) {
            rdKomponenGajiYa.setSelected(true);
            rdKomponenGajiTidak.setSelected(false);
            txtboxNamaKomponen.setValue(dao.selectKomponeGaji(obj.getKodeKomponenGaji()).getNmKomponen());
            txtboxKdKomponenGaji.setValue(obj.getKodeKomponenGaji());
        } else {
            rdKomponenGajiYa.setSelected(false);
            rdKomponenGajiTidak.setSelected(true);
            txtboxNamaKomponen.setValue(obj.getKomponenDiluarGaji());
            txtboxKdKomponenGaji.setValue("");
        }
        cmbboxKomponenPegawai.setValue(dao.selectKomponenPegawai(obj.getAdm()).getNm_stat_edu());
        idKomponenPegawai.setValue(obj.getKodeKomponenGaji());
        txtboxAlias.setValue(obj.getAlias());
        txtboxRumus.setValue(obj.getRumus());
        setDisableComponen(true);
    }

    private void setDisableComponen(boolean status) {
        cmbboxTahunKomponen.setDisabled(status);
        cmbboxKomponenPegawai.setDisabled(status);
        rdKomponenGajiTidak.setDisabled(status);
        rdKomponenGajiYa.setDisabled(status);
        txtboxNamaKomponen.setDisabled(status);
        btnCariNamaKomponen.setDisabled(status);
        txtboxAlias.setDisabled(status);
        txtboxRumus.setDisabled(status);
    }
    // revisied by : Taufan (BAPSI)
    public void txtboxRumusOnChanging() throws Exception {
        boolean kondisi = true;
        String PesanError = "";
        String value = txtboxRumus.getValue();
        char before = '?';
        char data = '?';
        int sizeData = value.length();
        int indexData = sizeData - 1;
        data = value.charAt(indexData);


        if (sizeData == 1) { // jika merupakan karakter pertama
//                after = value.charAt(i+1);
//            if (isAngka(String.valueOf(data)) || isKomponen(String.valueOf(data)) ||
//                    cekSimbol(String.valueOf(data), "", 2)) {
//            } else
            if (isOperator(String.valueOf(data))) {
                kondisi = false;
                PesanError = "Operator tidak boleh di awal rumus";
            } else if (!cekSimbol(String.valueOf(data), "", 2)) {
                kondisi = false;
                PesanError = ") tidak boleh di awal rumus";
            } else if (String.valueOf(data).equals(".")) {
                kondisi = false;
                PesanError = "Tanda '.' tidak boleh di awal rumus";
            } else {
//                kondisi = false;
//                PesanError = "Inputan tidak berupa angka, simbol, operator, atau komponen";
            }
        } else { //jika merupakan karakter berikutnya
            before = value.charAt(indexData - 1);
            if (isAngka(String.valueOf(data))) {
                if (isKomponen(String.valueOf(before))) {
                    kondisi = false; // jika angka berurutan dengan komponen
                    PesanError = "Angka tidak boleh berurutan dengan komponen";
                } else if (!cekSimbol(String.valueOf(before), String.valueOf(data), 0)) {
                    kondisi = false;
                    PesanError = ") tidak boleh diikuti dengan angka";
                }
            } else if (isKomponen(String.valueOf(data))) {
                if (isKomponen(String.valueOf(before))) {
                    kondisi = false; // jika komponen berurutan
                    PesanError = "Komponen tidak boleh berurutan dengan komponen";
                } else if (isAngka(String.valueOf(before))) {
                    kondisi = false; // jika komponen berurutan dengan angka
                    PesanError = "Komponen tidak boleh berurutan dengan angka";
                } else if (!cekSimbol(String.valueOf(before), String.valueOf(data), 0)) {
                    kondisi = false;
                    PesanError = ") tidak boleh diikuti dengan komponen";
                } else if (String.valueOf(before).equals(".")) {
                    kondisi = false;
                    PesanError = "tanda '.' tidak boleh digunakan";
                }
            } else if (isOperator(String.valueOf(data))) {
                if (isOperator(String.valueOf(before))) {
                    kondisi = false; // jika simbol operasi berurutan
                    PesanError = "Operator tidak boleh berurutan";
                } else if (!cekSimbol(String.valueOf(before), String.valueOf(data), 0)) {
                    kondisi = false;
                    PesanError = "Tanda ( tidak boleh diikuti dengan operator";
                } else if (isAngka(String.valueOf(before))) {
                    isDot = false;
                } else if (String.valueOf(before).equals(".")) {
                    kondisi = false;
                    PesanError = "tanda '.' tidak boleh digunakan";
                }
            } else if (!cekSimbol(String.valueOf(data), String.valueOf(before), 1)) {
                kondisi = false;
                PesanError = "Operator tidak boleh diikuti ) atau " +
                        "Angka tidak boleh diikuti (";
            } else if (String.valueOf(data).equals(".")) {
                if (isDot) {
                    kondisi = false;
                    PesanError = "tanda '.' tidak boleh digunakan";
                } else if (isKomponen(String.valueOf(before)) ||
                        isOperator(String.valueOf(before)) ||
                        !cekSimbol(String.valueOf(before), String.valueOf(data), 0)) {
                    kondisi = false;
                    PesanError = "tanda '.' tidak boleh digunakan";
                } else {
                    isDot = true;
                }
            } else {
//                kondisi = false;
//                PesanError = "Inputan tidak berupa angka, simbol operasi, atau komponen";
            }
        }

        if (kondisi == false) {
            txtboxRumus.setStyle("color:red;");
            if (value.length() > 0) {
                txtboxRumus.setValue(value.substring(0, sizeData - 1));
            }
            lblPesanError.setVisible(true);
            lblPesanError.setValue(PesanError);
        } else {
            txtboxRumus.setStyle("color:blue;");
            lblPesanError.setVisible(false);
        }

        // pengecekan kurung buka dan kurung tutup
        if (kurungBuka < kurungTutup) {
            lblPesanError.setVisible(true);
            lblPesanError.setValue(PesanError + "|Gunakan tanda kurung buka dahulu");
            if (value.length() > 0) {
                txtboxRumus.setValue(value.substring(0, sizeData - 1));
            }
            kurungTutup--;
        } else if (kurungBuka > kurungTutup) {
            lblPesanError.setVisible(true);
            lblPesanError.setValue(PesanError + "|Tanda kurung tutup kurang");
        }
    }

    public boolean isAngka(String data) {
        boolean kondisi = false;
        String angka[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
        for (int i = 0; i <
                angka.length; i++) {
            if (data.equals(angka[i])) {
                kondisi = true;
            }

        }
        return kondisi;
    }

    public boolean isOperator(String data) {
        boolean kondisi = false;
        String simbol[] = {"*", "/", "+", "-"};
        for (int i = 0; i <
                simbol.length; i++) {
            if (data.equals(simbol[i])) {
                kondisi = true;
            }
        }
        return kondisi;
    }

    public boolean isKomponen(String data) throws Exception {
        @SuppressWarnings("static-access")
        String tahun = this.cmbboxTahunKomponen.getValue();
        boolean kondisi = false;
        for (PerekamanKomponenAnggaranBiayaGaji obj : dao.list(tahun)) {
            if (obj.getAlias().equals(data)) {
                kondisi = true;
            }
        }
        return kondisi;
    }

    public boolean cekSimbol(String dataSimbol, String dataComparator, int statusData) throws Exception {
        boolean kondisi = false;
        if (statusData == 0) { // simbol sebagai data sebelumnya
            if (dataSimbol.equals("(")) {
                if (isAngka(dataComparator) || isKomponen(dataComparator)) {
                    kondisi = true;
                }
            } else if (dataSimbol.equals(")")) {
                if (isOperator(dataComparator)) {
                    kondisi = true;
                }
            } else {
                kondisi = true;
            }
        } else if (statusData == 1) { // data
            if (dataSimbol.equals("(")) {
                if (isOperator(dataComparator)) {
                    kurungBuka++;
                    kondisi = true;
                }
            } else if (dataSimbol.equals(")")) {
                if (isAngka(dataComparator) || isKomponen(dataComparator)) {
                    kurungTutup++;
                    kondisi = true;
                }
            } else {
                kondisi = true;
            }
        } else if (statusData == 2) { // dataSimbol sebagai data awal
            if (dataSimbol.equals("(")) {
                kurungBuka++;
                kondisi = true;
            } else if (!dataSimbol.equals(")")) {
                kondisi = true;
            }
        } else {
            kondisi = true;
        }
        return kondisi;
    }

    public void clearTxtboxRumus() throws Exception {
        txtboxRumus.setValue("");
        kurungBuka =
                0;
        kurungTutup =
                0;
        lblPesanError.setValue("");
        lblPesanError.setVisible(false);
    }

//
}

